WEBVTT 00:00.000 --> 00:09.000 Next up we have Jesse Vincent giving a talk called automating fabrication outputs with key cad and git. 00:09.000 --> 00:19.000 Jesse is the co-founder and CTO of keyboardio and has been designing keyboards with key cad for the past four years. 00:19.000 --> 00:23.000 In previous lives he was mostly a software person. Please welcome them to the stage. 00:23.000 --> 00:32.000 Hello. Let's see. Can you folks hear me right? 00:32.000 --> 00:38.000 So, hi I'm Jesse. I make keyboards as you just learned. 00:38.000 --> 00:43.000 First up, this talk is all Chris Gamble's fault. 00:43.000 --> 00:49.000 I had this perfectly nice little Perl script that let me generate schematics. 00:49.000 --> 00:53.000 And Chris was like, oh you should give a talk about that at Keycon. 00:53.000 --> 01:00.000 And somehow that resulted in me creating this horrible, horrible monstrosity I'm about to present to you. 01:00.000 --> 01:06.000 In the process I managed to cause a lot of people on Twitter to get really, really angry with me. 01:06.000 --> 01:13.000 So the pro tip here is that you should never, ever mention Perl and Python and Docker in one tweet. 01:13.000 --> 01:18.000 I had people who were angry about Perl, people were angry about Python, people were angry about Docker. 01:18.000 --> 01:23.000 And a bunch of people were like, you're paid by the hour, aren't you? 01:23.000 --> 01:31.000 So some important things to know about this talk is that I am building on a lot of really cool stuff that a lot of other people have done. 01:31.000 --> 01:38.000 Almost everything I did was sys admin work. It was more shell scripting and make files than anything else. 01:38.000 --> 01:44.000 Everything I'm showing off is free. It's all open source. 01:44.000 --> 01:53.000 And it ought to work pretty much anywhere, but I've only tested it on Linux because I ran out of time. 01:53.000 --> 01:57.000 It is also important to know that this talk is not about best practices. 01:57.000 --> 02:06.000 It is about a thing that you might be able to use to get shit done and spend a little bit less time messing around with tools. 02:06.000 --> 02:12.000 The first thing I want to talk about is fabrication outputs. 02:12.000 --> 02:19.000 I have people asking me why one would want to bother automating fabrication outputs because you don't do it that often. 02:19.000 --> 02:22.000 And it's pretty straightforward. 02:22.000 --> 02:32.000 So has anybody here ever gotten back a board order they placed where all the plated through holes they had thought they put on their board were missing? 02:32.000 --> 02:35.000 No, I haven't either. 02:35.000 --> 02:37.000 Yeah, automation is really, really good. 02:37.000 --> 02:42.000 Automation is really, really useful. 02:42.000 --> 02:46.000 So we're going to start from schematics and we'll work our way to layouts. 02:46.000 --> 02:51.000 Back in the bad old days, the way that you'd plot your schematics, well, you'd do it by hand. 02:51.000 --> 02:54.000 You'd launch a schema. You'd get your nice window. 02:54.000 --> 02:59.000 You'd either use your mouse or you'd hit Alt-F and you'd get your file menu. 02:59.000 --> 03:03.000 Then you'd hit L, but it only works if it's a lowercase L. 03:03.000 --> 03:07.000 So you've got plot highlighted and then you can hit Enter and then you get your dialog. 03:07.000 --> 03:09.000 And now you can do your plots. 03:09.000 --> 03:14.000 You type something in and you hit Tab and you can select what kind of thing you're plotting. 03:14.000 --> 03:23.000 You hit Tab again and again and about a dozen tabs later, if I remember to count right, then you can actually get some stuff outputted. 03:23.000 --> 03:27.000 Yay, I'm done. I've plotted my schematics. Why would anyone automate that? 03:27.000 --> 03:31.000 Well, if you're paying any attention, you'll note that there's a problem here. 03:31.000 --> 03:34.000 Can anybody spot it? 03:34.000 --> 03:42.000 So I said I was plotting PDFs into my PDF output directory, but I accidentally plotted SVGs. 03:42.000 --> 03:47.000 This was a legit mistake I made when I was prepping for the talk and doing slides. 03:47.000 --> 03:56.000 And humans make mistakes. Machines pretty much never make mistakes. 03:56.000 --> 03:59.000 So let's automate some schematic plotting. 03:59.000 --> 04:06.000 Earlier today there was another talk that shows off another way to do automated schematic plotting using a tool called EEShow, 04:06.000 --> 04:13.000 which was written in the KiCad 4 era and was written for the Open MoCo. 04:13.000 --> 04:17.000 And it's kind of bit rotted and it doesn't support KiCad 5, 04:17.000 --> 04:24.000 and it's a third-party engine that tries to understand schematic files and generate similar output. 04:24.000 --> 04:31.000 And early on I made the decision that I only wanted to let KiCad tell me what KiCad files looked like, 04:31.000 --> 04:38.000 because anything else is a lie. It's a possibly very friendly lie, but it's a lie. 04:38.000 --> 04:44.000 So to automate schematic outputs, I'm using an important tool called Docker. 04:44.000 --> 04:49.000 If you have ever used Docker, you will know that it is essentially a virtual machine engine. 04:49.000 --> 04:55.000 And the first question I'm going to get is, what was I smoking? 04:55.000 --> 04:57.000 Yeah, I live in California, whatever. 04:57.000 --> 05:00.000 But the important thing here is that it gets us a couple of things. 05:00.000 --> 05:06.000 It gets us portability, so all this tooling should be able to run on multiple platforms, 05:06.000 --> 05:10.000 and it gets us a known KiCad version, an exact known KiCad version. 05:10.000 --> 05:16.000 And that's really important because EESchema's API breaks every single release. 05:16.000 --> 05:21.000 I'm not talking about the nice Python API, which even though it's not officially stable yet, 05:21.000 --> 05:24.000 it is stable enough to use pretty reliably. 05:24.000 --> 05:28.000 I'm talking about the API we've got for EESchema. 05:28.000 --> 05:34.000 It is not a great API, but it's the API that we've got. 05:34.000 --> 05:40.000 It's really not good, but it is the best because it's there. 05:40.000 --> 05:44.000 In fact, this is an API that I've already demoed. 05:44.000 --> 05:50.000 This is that API. Well, this was in 4.0, and this was 5, and this is 5.1. 05:50.000 --> 05:54.000 And that API has improved every time, but it's changed every time. 05:54.000 --> 06:00.000 So anything you're going to be doing to automate that is going to break with every release. 06:00.000 --> 06:02.000 So we shove it into Docker. 06:02.000 --> 06:04.000 Docker is a virtual machine engine. 06:04.000 --> 06:08.000 Use a tool called xVFB, which is essentially a virtual screen, 06:08.000 --> 06:12.000 so it pretends to have a monitor attached so you can run it headless. 06:12.000 --> 06:16.000 And then there's this cute little ancient Unix utility that I thought I would never have to use again 06:16.000 --> 06:20.000 after 1994 called xDoTool. 06:20.000 --> 06:26.000 It is essentially a virtual human that can move the mouse and press keys. 06:26.000 --> 06:32.000 And so we can use these things to trick KCAD or anything else into giving us a functional API. 06:32.000 --> 06:36.000 And so we jump through all these hoops just to plot schematics. 06:36.000 --> 06:44.000 I want to repeat again that this is a horrible and disgusting hack, 06:44.000 --> 06:48.000 and it's encapsulated so you never have to see it. 06:48.000 --> 06:54.000 And that means that as there are better options, it can be replaced without you having to change tooling. 06:54.000 --> 06:59.000 To output bombs, we have to do the exact same thing. 06:59.000 --> 07:07.000 To plot layouts, well, for boards, I use KeyPlot because I'm not absolutely stupid and insane. 07:07.000 --> 07:12.000 If you've never touched KeyPlot, it's a really nice, well-documented Python tool, 07:12.000 --> 07:19.000 and it uses the built-in API and has a really nice config file format and is maintained, 07:19.000 --> 07:26.000 and it will plot boards for you all day and all night without complaining. 07:26.000 --> 07:32.000 Of course, we also will generate an interactive bomb using interactive HTML bomb, another nice tool. 07:32.000 --> 07:39.000 But this is all set up so that I put this stuff all together in one place so that you don't need to mess around with this. 07:39.000 --> 07:46.000 Everybody I've talked to has done part of this or all of this two or three times for one project or another, 07:46.000 --> 07:52.000 and then something changes and it bit-rots, and you never quite get around to putting it back together again. 07:52.000 --> 08:01.000 So it's my hope that by bundling this all in one place, it'll just work, well, hopefully everywhere, 08:01.000 --> 08:08.000 but tell me if it doesn't, and that you won't really have to maintain it very much. 08:08.000 --> 08:12.000 If you want to play with it, that is a thing that you can do today. 08:12.000 --> 08:17.000 It is just a couple of lines. You are grabbing my repository from GitHub. 08:17.000 --> 08:23.000 You are pulling in all the other tools that I'm using. You are sticking this stuff in your path, 08:23.000 --> 08:27.000 and then that make is going to run for like 10 or 15 minutes while it builds the Docker image 08:27.000 --> 08:34.000 with Ubuntu and KiCad 5.1 and a bunch of other tools, but then it's there and done. 08:34.000 --> 08:38.000 Once you've got it installed, if you want to try this in one of your projects, 08:38.000 --> 08:43.000 it's a not terribly complicated install process. 08:43.000 --> 08:47.000 You go into your project, and if you don't already have your own make file, you copy ours on top. 08:47.000 --> 08:50.000 It will figure out where it's installed and what your project is named, 08:50.000 --> 08:54.000 and then you can do things like type make fabrication outputs. 08:54.000 --> 09:00.000 That's all you need to do, I think. When it doesn't work, tell me. 09:00.000 --> 09:06.000 So what you get, of course, you can get make bomb, which will give you a grouped CSV bomb. 09:06.000 --> 09:10.000 All of this stuff is hackable but should be more configurable, 09:10.000 --> 09:14.000 and I'm thrilled to take bug reports about which parts should be more configurable. 09:14.000 --> 09:17.000 But make bomb will generate something like that for you. 09:17.000 --> 09:23.000 Make interactive bomb, if you've never played with interactive HTML bomb, it's really pretty. 09:23.000 --> 09:27.000 It'll show you your boards, it'll show you everything that needs to be placed on your boards, 09:27.000 --> 09:32.000 it'll walk you through hand placement. It's a great tool. 09:32.000 --> 09:39.000 Make schematic SVG will generate a bunch of SVGs of your schematics, things like that. 09:39.000 --> 09:43.000 Make schematic PDF will generate PDFs of your schematics. 09:43.000 --> 09:47.000 Make gerbers generates gerbers and drill files. 09:47.000 --> 09:52.000 As of now, it also generates PDFs and Postscript files and SVGs and DXFs, 09:52.000 --> 09:56.000 and yes, I've actually needed all of those with my manufacturer at various times. 09:56.000 --> 09:59.000 But again, should be more configurable. 09:59.000 --> 10:01.000 But all you've got to do is type once, and on my laptop running, 10:01.000 --> 10:06.000 it takes about a minute and a half to chug through all this stuff, including zipping it up. 10:06.000 --> 10:12.000 So that's fabrication outputs, but I've got some more toys. 10:12.000 --> 10:19.000 A bunch of people have talked about Git this weekend. 10:19.000 --> 10:26.000 Who here uses some kind of version control system? 10:26.000 --> 10:32.000 I've discovered that when I ask the other way, no one is ever willing to raise their hand, and that is okay. 10:32.000 --> 10:37.000 But version control is really good if it is not a thing that you are familiar with, it is worth spending time, 10:37.000 --> 10:40.000 because you can figure out some very important stuff. 10:40.000 --> 10:45.000 You can figure out what changed, you can figure out when it changed and who changed it, 10:45.000 --> 10:51.000 and most importantly, if you write good commit messages, you can figure out why it changed. 10:51.000 --> 10:56.000 And that's the one thing I'm going to harp on about how to use a version control system, 10:56.000 --> 11:00.000 is that when you do that check-in and you're writing a message about what you just did, 11:00.000 --> 11:05.000 you can see that you moved a component or that you changed a trace width. 11:05.000 --> 11:12.000 But somebody, and that somebody may be you a year from now, may not understand the reason behind it. 11:12.000 --> 11:18.000 And so if your commit message just talks about the why, it is going to make your life better. 11:18.000 --> 11:25.000 Everything else, all of the what can be reverse engineered pretty easily, but the state that's in your head can't. 11:25.000 --> 11:30.000 Most everybody these days uses Git for version control, and Git is primarily designed for code. 11:30.000 --> 11:33.000 It was originally designed for the Linux kernel. 11:33.000 --> 11:38.000 It is okay for key cad projects. It's not great for key cad projects. 11:38.000 --> 11:42.000 And the thing that most people will point to is Git diff. 11:42.000 --> 11:48.000 Git diff is an incredibly cool tool when you're working with code, which is text. 11:48.000 --> 11:56.000 And it's kind of a shitty tool when you're working with layouts and schematics and just about anything else. 11:56.000 --> 12:01.000 It doesn't help that key cad's file formats weren't originally designed for version control. 12:01.000 --> 12:07.000 This came up in the panel discussion last night, and I learned some cool new stuff. 12:07.000 --> 12:13.000 But the big issue is that automatic changes to your files causes churn. 12:13.000 --> 12:23.000 So making a tiny change in a file and hitting save may cause cascaded changes amounting to tens of thousands of lines of code. 12:23.000 --> 12:26.000 Or tens of thousands of lines. 12:26.000 --> 12:30.000 There are ways to minimize those. 12:30.000 --> 12:35.000 So some of the things you'll see are schematic and power and flag auto renumbering, 12:35.000 --> 12:41.000 component ordering seeming to jump out from underneath you in your layout files. 12:41.000 --> 12:46.000 You'll see configuration and state get mixed together occasionally. 12:46.000 --> 12:51.000 And there are parts of Git's tooling that give you rope to make this better. 12:51.000 --> 12:59.000 If you've heard of a tool called plot key cad schematic, another third party tool that will attempt to emulate what EESchema does to plot schematics, 12:59.000 --> 13:06.000 the author has a fairly nice write up of some stuff he does to make his schematics less churning. 13:06.000 --> 13:08.000 And it's this. 13:08.000 --> 13:11.000 It uses a Git feature that when you check out a file, it tweaks it. 13:11.000 --> 13:13.000 And when you check a file in, it tweaks it. 13:13.000 --> 13:24.000 So that in this case, he is making power and flag numbers just vanish, pulling the updated date out of your project file. 13:24.000 --> 13:33.000 It's not rocket science, and it's something where I would be comfortable using regular expressions to do this. 13:33.000 --> 13:40.000 As I learned last night, there's a bunch more stuff that can be done to make your files churn less using a feature like this, 13:40.000 --> 13:45.000 but you need to know a lot about how layout and schematic files work. 13:45.000 --> 13:48.000 And that also means you need to parse them. 13:48.000 --> 13:59.000 And if you are using said expressions to parse complicated files like the S expressions that are RPCB files, it's really easy to screw up. 13:59.000 --> 14:02.000 And so it's a thing that can be done. 14:02.000 --> 14:04.000 It makes your Git history look nicer. 14:04.000 --> 14:10.000 It simplifies your diffs, and I am pretty lukewarm on it. 14:10.000 --> 14:12.000 You do lose information. 14:12.000 --> 14:14.000 The diffs aren't great. 14:14.000 --> 14:15.000 Like, they make it better. 14:15.000 --> 14:17.000 They don't make it good. 14:17.000 --> 14:24.000 So a bunch of stuff I've spent a bunch of time working on making layout diffs hurt less. 14:24.000 --> 14:36.000 So if you've ever diffed one of your boards doing something like this, I am comparing my board to what was three revisions earlier. 14:36.000 --> 14:38.000 I got this. 14:38.000 --> 14:41.000 As it happens, I upgraded to 5.1. 14:41.000 --> 14:47.000 I removed some tracks, and things start getting complicated. 14:47.000 --> 14:53.000 There's some stuff that could get removed, and then some stuff got reordered, and my eyes started to glaze over, 14:53.000 --> 14:58.000 and then I checked and saw that it was 60,000 lines of diff. 14:58.000 --> 14:59.000 Yeah. 14:59.000 --> 15:05.000 So, but this all goes to say that if we're editing graphically, we should be diffing graphically. 15:05.000 --> 15:07.000 And that is a thing that can be done. 15:07.000 --> 15:15.000 So with a tiny little bit of setup, that same command, instead of those 60,000 lines of diff, can plot this. 15:15.000 --> 15:23.000 And so what we've got here, I will admit that I only handle two-layer boards, but adding more layers is a for loop. 15:23.000 --> 15:25.000 I just haven't dealt. 15:25.000 --> 15:39.000 So you've got your top, which is a mix of footprints and silk spreen and mask, just because it mostly all changes the same way at the same time, 15:39.000 --> 15:43.000 and having 12 different panels to compare gets annoying. 15:43.000 --> 15:51.000 So you can see that I'm using a little bit of a smaller, you know, two copper layers, and the bottom is the bottom equivalent of the top. 15:51.000 --> 15:57.000 So I can see pretty quickly here that what I was doing is I was moving those three key switches at the bottom of my keyboard, 15:57.000 --> 16:02.000 and then doing a bunch of really painful re-layout, because I didn't have some space. 16:02.000 --> 16:12.000 So this is a fun thing, and the very first version of this was this horrible hack that took me, like, four hours of installing software to make it go, 16:12.000 --> 16:14.000 I want to help you guys get it installed a little bit easier. 16:14.000 --> 16:22.000 So if you have installed the stuff from step one, the install is really easy. It's already there. 16:22.000 --> 16:31.000 You do need to do some setup to tell Git that when it sees a key cad layout, it should use our special diff tool. 16:31.000 --> 16:38.000 And so all this does is it says, hey, Git, if you see any file whose name ends in.keycadpcb, 16:38.000 --> 16:44.000 then you want to use the key cad PCB diff tool, which is that thing we just installed. 16:44.000 --> 16:51.000 On the back end, it uses the Docker VM and a Python script to render the images and image magic, 16:51.000 --> 17:00.000 and a whole bunch of caching, because this is not a fast operation, and then draws you a composite of those two images. 17:00.000 --> 17:04.000 So that's layout diffs. Schematics. Now, text diffs of schematics are better. 17:04.000 --> 17:12.000 The file format is a little bit more diffable. It's like you can kind of read it. 17:12.000 --> 17:21.000 So, for example, here's diffing three revisions ago of my MCU schematic page, and some stuff changed, 17:21.000 --> 17:27.000 but I get what's going on, and some other stuff changed, and I get what's going on, and I can understand it, 17:27.000 --> 17:32.000 but it gets tedious, because there are 40 screens of diff. 17:32.000 --> 17:36.000 So, again, visual tools are nice. 17:36.000 --> 17:43.000 So, for annoying reasons that I'm only willing to talk about with alcohol, 17:43.000 --> 17:49.000 Git diff cannot be bludgeoned into doing schematics in exactly the same way, 17:49.000 --> 17:52.000 so we have to use a custom Git schematic diff tool. 17:52.000 --> 18:03.000 And when we do that, we can see that all those 40 screens of diff were some updates that were really just three footprints 18:03.000 --> 18:08.000 that changed slightly when I upgraded to 5.1. 18:08.000 --> 18:11.000 And that's useful to know. 18:11.000 --> 18:19.000 So I do want to repeat, it's a horrible hack. It works around EE schema. It works around Git, but it does work. 18:19.000 --> 18:25.000 And for installation, again, it's already installed, and set up. 18:25.000 --> 18:31.000 It's already set up because Git doesn't actually let us do anything to run it directly. 18:31.000 --> 18:37.000 So I've got about 10 minutes left, but that's all the cool toys I have to show off. 18:37.000 --> 18:41.000 In the future, I would love this package to automatically install key cost, 18:41.000 --> 18:45.000 which is this really cool tool that will automatically price your bomb, 18:45.000 --> 18:49.000 but when OctoPart dropped their free API, it stopped working. 18:49.000 --> 18:53.000 It looks like they're rewriting it, but it doesn't exist. 18:53.000 --> 18:55.000 We should be doing step exports. 18:55.000 --> 19:03.000 I would really like design rules and electrical rules to be able to be checked from the command line. 19:03.000 --> 19:08.000 It should be pretty straightforward to have this turn these outputs into orderable board packages 19:08.000 --> 19:16.000 so that you can literally type make Oshpark upload and have it basically put an order in on Oshpark, 19:16.000 --> 19:20.000 so with no human interaction. 19:20.000 --> 19:25.000 It should be more configurable than it is now, but it should work. 19:25.000 --> 19:32.000 It needs to get tested on Windows and Mac, though you can run Docker on both of those, so it should behave. 19:32.000 --> 19:36.000 I had this list of things that I really wanted key CAD to do to make all this easier, 19:36.000 --> 19:39.000 and E-scheme is getting its new API in six, so I'm happy with that. 19:39.000 --> 19:43.000 The second thing is a lot of the time that this takes to run, 19:43.000 --> 19:48.000 when uncached it can take like 20 seconds to generate one of these diffs as it's going off 19:48.000 --> 19:51.000 and doing a bunch of exports and doing a bunch of compares. 19:51.000 --> 19:57.000 A bunch of that is generating PDFs and then converting the PDFs into raster images, which is dumb. 19:57.000 --> 20:03.000 I don't actually know if the output libraries that key CAD uses can generate raster images trivially, 20:03.000 --> 20:09.000 but it'd be nice, but I realize I don't have a whole lot on my wish list these days. 20:09.000 --> 20:12.000 These slides will be online. 20:12.000 --> 20:14.000 I've got some resources. 20:14.000 --> 20:21.000 By that I mean prior art, and by that I mostly mean projects that I have looted wholesale to make all this go. 20:21.000 --> 20:25.000 For the schematic generation stuff, I started with my horrible tools 20:25.000 --> 20:30.000 and discovered that these nice folks at Productize in Belgium had done a much nicer version 20:30.000 --> 20:33.000 that at the time didn't actually work. 20:33.000 --> 20:38.000 It turns out they had actually pulled it from Scott's split flap project, 20:38.000 --> 20:42.000 where he had done this all for a single project. 20:42.000 --> 20:52.000 There are two tools out there that I know of that will do direct schematic plotting from.schematic files. 20:52.000 --> 20:56.000 Neither of them appears to work well in the modern world, 20:56.000 --> 20:59.000 but they exist and you may have more luck than me. 20:59.000 --> 21:02.000 Layout diffs, there's some prior art there. 21:02.000 --> 21:08.000 The tricks for generating those composite images to show you diffs of boards and schematics 21:08.000 --> 21:11.000 is something that Wendell, a evil mad scientist, did in 2011 21:11.000 --> 21:16.000 and has been trying to get other people to do since then. 21:16.000 --> 21:18.000 But yeah, that's pretty much what I've got. 21:18.000 --> 21:23.000 If you want to try this thing out, you can pull it down from GitHub. 21:23.000 --> 21:26.000 Are there questions? 21:26.000 --> 21:34.000 Applause 21:34.000 --> 21:55.000 Why go to such an extent as making some application that clicks in the plot window 21:55.000 --> 22:01.000 over a virtual machine instead of writing a few lines of C++ just to invoke the plotter? 22:01.000 --> 22:07.000 Because I'm a shitty C++ dev. 22:07.000 --> 22:11.000 The other thing is I had my tiny little Perl script that did this 22:11.000 --> 22:15.000 and then discovered that somebody had built a fairly nice implementation of this 22:15.000 --> 22:20.000 and then I discovered it didn't work and was already fairly committed at that point 22:20.000 --> 22:23.000 and on deadline for the conference. 22:23.000 --> 22:30.000 I would be absolutely thrilled to see tools that link against the eSchemas library, 22:30.000 --> 22:37.000 and I'm told that that is possibly more involved than one might imagine. 22:37.000 --> 22:40.000 But no, I'd be thrilled to throw all this out tomorrow. 22:40.000 --> 22:43.000 Doing it the right way, yeah, it's certainly more involved, 22:43.000 --> 22:52.000 but making a quick hack in C++ that plots the symbols or the PCB to a file is not a big deal. 22:52.000 --> 22:57.000 If you are volunteering or could be guilt-tripped into it, I'd be happy to chatter later. 22:57.000 --> 23:06.000 Hey guys, I volunteered to do that right after I've written the drag footprint with traces-connected feature, okay? 23:06.000 --> 23:10.000 I got to ask, you know. 23:10.000 --> 23:19.000 Other questions? 23:19.000 --> 23:25.000 So that's a real nice horse. Now I want to look inside its mouth and see its teeth. 23:25.000 --> 23:32.000 How would you extend this to work with an online tool, like with GitHub or GitLab or something like that? 23:32.000 --> 23:39.000 So my understanding is that with GitLab there are in fact a bunch of cool configuration hooks 23:39.000 --> 23:44.000 where you could basically use all of these makefile targets to do auto-generation. 23:44.000 --> 23:52.000 For GitHub, I would probably set up a Travis VM that's SCPing stuff somewhere. 23:52.000 --> 24:07.000 Awesome. 24:07.000 --> 24:16.000 If there was one thing you would change about the file format of either the schematic or the PCB, what would it be? 24:16.000 --> 24:25.000 It would be PCB not schematic, and I don't actually know at a deep level what's going on, 24:25.000 --> 24:30.000 but I believe that we could get stable ordering for components by timestamp, 24:30.000 --> 24:38.000 which I believe is the most stable thing about a component, and that would cause a lot less churn. 24:38.000 --> 24:50.000 It's not super important once you're going to something that's not diffing text, but it would be nice. 24:50.000 --> 24:54.000 Anything else? Any other questions? 24:54.000 --> 25:09.000 All right. Thank you very much. Thanks, everybody.